什么是持续集成

  • 概述

    持续集成Continuous Integration,简称CI)指的是,频繁地(一天多次)将代码集成到主干

    GitLab CIGitLab 提供的持续集成服务,只要在你的仓库根目录 创建一个.gitlab-ci.yml 文件, 并为该项目指派一个Runner当有合并请求或者 push的时候就会触发build

    .gitlab-ci.yml 文件定义GitLab runner要做哪些操作。 默认有3个[stages(阶段)]: buildtestdeploy

  • 优点

    • 可以快速发现错误,定位错误也比较容易
    • 防止分支大幅偏离主干。代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成
    • 持续交付、持续部署
      • 持续交付Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
      • 持续部署Continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
  • 持续集成系统的组成

    • 一个自动构建过程,包括自动编译、分发、部署和测试等。
    • 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。
    • 一个持续集成服务器

搭建持续集成环境

  • 登录 GitLab 新建一个空的工程(如gitlab-ci-test)

  • 左侧工具栏依次选择: 设置 -> CI/CD 进行手动设置指定运行器

  • 配置专用 Runner

    • 安装 GitLab Runner

      各平台安装教程可至官网教程查看, 这里仅对Linux平台进行介绍。

      在Linux平台上搭建有两种方式

      1. 虚拟机。如macOS上的Parallels Desktop

        • 第一步,下载

          1
          2
          # 64位机器
          sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
        • 第二步,加执行权限

          1
          sudo chmod +x /usr/local/bin/gitlab-runner
        • 第三步,下载docker (可选,可不执行)

          1
          curl -sSL https://get.docker.com/ | sh
        • 第四步,创建一个 gitlab-ci 用户

          1
          sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
        • 第五步,启动runner

          1
          2
          3
          4
          5
          # install
          sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

          # run
          sudo gitlab-runner start
      2. Docker 镜像启动

    • 注册 Runner (绑定持续集成工程)

      1
      sudo gitlab-runner register

      将会依次提示

      • Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )

        输入gitlab-ci的坐标地址:

      • Please enter the gitlab-ci token for this runner

        输入你的注册令牌:

      • Please enter the gitlab-ci description for this runner

        为你的Runner设置描述信息, 看个人喜好, 这里设置 my-first-runner

      • Please enter the gitlab-ci tags for this runner (comma separated):

        为你的Runner设置标签信息, 之后.gitlab-ci.yml可配置不同的tag来跑不同的Runner, 这里设置Local-Ubuntu-16-04

      • Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker parallels, virtualbox, docker-ssh, shell:

        为你的Runner设置执行器, 这里设置shell

      测试完毕后刷新我们的gitlab工程, 可以看到注册后的Runner

      发现这边有个感叹号, 这是由于我们的测试工程未进行标记, 可以进入箭头指向的设置按钮

      勾选允许运行未标记的作业, 保存修改

  • 编写最简单的测试工程

  • 工程目录

    1
    2
    3
    4
    5
    6
    7
    8
    ├── gitlab-ci-test
       ├── .gitlab-ci.yml
       ├── build.sh
       ├── clean.sh
       ├── CMakeLists.txt
       ├── main.cpp
        ├── README.md
    └── run.sh

    main.cpp简单打印HelloWorld!

  • 配置.gitlab-ci.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    before_script:
    - echo "Start gitlab-ci deploy"
    after_script:
    - echo "End gitlab-ci deploy"

    stages:
    - build
    - test
    - deploy

    build:
    stage: build
    tags:
    - Local-Ubuntu-16-04
    script:
    - echo "Now, do build"
    - sh build.sh
    only:
    - develop
    - master

    test:
    stage: test
    tags:
    - Local-Ubuntu-16-04
    script:
    - echo "Now, do test"
    - sh build.sh
    - sh run.sh
    only:
    - develop
    - master

    deploy:
    stage: deploy
    tags:
    - Local-Ubuntu-16-04
    script:
    - echo "Now, do deploy"
    - sh clean.sh
    only:
    - develop
    - master
  • 推送到远程仓库

  • 查看持续集成结果

其他参考

内置的环境变量

https://docs.gitlab.com/ce/ci/variables/README.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
export CI_JOB_ID="50"
export CI_COMMIT_SHA="1ecfd275763eff1d6b4844ea3168962458c9f27a"
export CI_COMMIT_SHORT_SHA="1ecfd275"
export CI_COMMIT_REF_NAME="master"
export CI_REPOSITORY_URL="https://gitlab-ci-token:abcde-1234ABCD5678ef@example.com/gitlab-org/gitlab-foss.git"
export CI_COMMIT_TAG="1.0.0"
export CI_JOB_NAME="spec:other"
export CI_JOB_STAGE="test"
export CI_JOB_MANUAL="true"
export CI_JOB_TRIGGERED="true"
export CI_JOB_TOKEN="abcde-1234ABCD5678ef"
export CI_PIPELINE_ID="1000"
export CI_PIPELINE_IID="10"
export CI_PAGES_DOMAIN="gitlab.io"
export CI_PAGES_URL="https://gitlab-org.gitlab.io/gitlab-foss"
export CI_PROJECT_ID="34"
export CI_PROJECT_DIR="/builds/gitlab-org/gitlab-foss"
export CI_PROJECT_NAME="gitlab-foss"
export CI_PROJECT_TITLE="GitLab FOSS"
export CI_PROJECT_NAMESPACE="gitlab-org"
export CI_PROJECT_PATH="gitlab-org/gitlab-foss"
export CI_PROJECT_URL="https://example.com/gitlab-org/gitlab-foss"
export CI_REGISTRY="registry.example.com"
export CI_REGISTRY_IMAGE="registry.example.com/gitlab-org/gitlab-foss"
export CI_REGISTRY_USER="gitlab-ci-token"
export CI_REGISTRY_PASSWORD="longalfanumstring"
export CI_RUNNER_ID="10"
export CI_RUNNER_DESCRIPTION="my runner"
export CI_RUNNER_TAGS="docker, linux"
export CI_SERVER="yes"
export CI_SERVER_URL="https://example.com"
export CI_SERVER_HOST="example.com"
export CI_SERVER_PORT="443"
export CI_SERVER_PROTOCOL="https"
export CI_SERVER_NAME="GitLab"
export CI_SERVER_REVISION="70606bf"
export CI_SERVER_VERSION="8.9.0"
export CI_SERVER_VERSION_MAJOR="8"
export CI_SERVER_VERSION_MINOR="9"
export CI_SERVER_VERSION_PATCH="0"
export GITLAB_USER_EMAIL="user@example.com"
export GITLAB_USER_ID="42"

参考链接